package com.gep.session.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.ejb.HibernateEntityManager;

import com.gep.dto.UsuarioDTO;
import com.gep.entity.Usuario;
import com.gep.session.UsuarioBORemota;
import com.gep.util.Conversor;

@Stateless(mappedName = "ejb/gep/UsuarioBORemota")
public class UsuarioBO implements UsuarioBORemota {

	private static final Logger LOGGER = Logger.getLogger(UsuarioBO.class);


	@PersistenceContext
	private EntityManager em;
	
	public Boolean validarLogin(UsuarioDTO usuarioDTO) throws Exception {
		Usuario usuario = (Usuario) Conversor.converter(usuarioDTO,
				new Usuario().getClass().getName());
		List<Usuario> usuarios = this.buscarUsuariosEntity(usuario);
		if (usuarios.size() == 1) {
			return true;
		} else {
			return false;
		}
	}

	public List<UsuarioDTO> buscarUsuarios(UsuarioDTO usuarioDTO) throws Exception {
		List<UsuarioDTO> usuariosDto = new ArrayList<UsuarioDTO>();
		List<Usuario> usuarios;

		Usuario usuarioBuscado = new Usuario();
		usuarioBuscado = (Usuario) Conversor.converter(usuarioDTO,
				usuarioBuscado.getClass().getName());
		usuarios = this.buscarUsuariosEntity(usuarioBuscado);

		for (Usuario usuario : usuarios) {

			UsuarioDTO dto = (UsuarioDTO) Conversor.converter(usuario,
					new UsuarioDTO().getClass().getName());
			usuariosDto.add(dto);

		}

		return usuariosDto;

	}

	@SuppressWarnings("unchecked")
	private List<Usuario> buscarUsuariosEntity(Usuario usuario) {
		Criteria criteria;
		List<Usuario> list;
		Session session;
		HibernateEntityManager hem;

		hem = (HibernateEntityManager) this.em.getDelegate();
		session = hem.getSession();

//		session = (Session) this.em.getDelegate();
		criteria = session.createCriteria(Usuario.class);
		if (usuario.getCodUsuario() != null) {
			criteria.add(Restrictions.idEq(usuario.getCodUsuario()));
		}
		if (usuario.getNomeUsuario() != null) {
			if (usuario.getNomeUsuario().length() != 0) {
				criteria.add(Restrictions.eq("nomeUsuario", usuario
						.getNomeUsuario()));
			}
		}
		if (usuario.getPerfil().getCodPerfil() != null) {
			criteria.add(Restrictions.eq("perfil", usuario.getPerfil()));
		}
		if (usuario.getLogin() != null) {
			if (usuario.getLogin() != "") {
				criteria.add(Restrictions.eq("login", usuario.getLogin()));
			}
		}
		if (usuario.getSenha() != null) {
			if (usuario.getSenha() != "") {
				criteria.add(Restrictions.eq("senha", usuario.getSenha()));
			}
		}
		list = criteria.list();
		return list;
	}

	public void apagarUsuario(UsuarioDTO usuarioDTO) throws Exception {
		Usuario usuario = (Usuario) Conversor.converter(usuarioDTO,
				new Usuario().getClass().getName());
		usuario = em.find(usuario.getClass(), usuario.getCodUsuario());
		em.remove(usuario);
	}

	public void salvarUsuario(UsuarioDTO usuarioDTO) throws Exception {
		Usuario usuario = (Usuario) Conversor.converter(usuarioDTO,
				new Usuario().getClass().getName());
		if (usuario.getCodUsuario() == null) {
			this.em.persist(usuario);

		} else {
				this.em.merge(usuario);

		}

	}}
